home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5b.s < prev    next >
Text File  |  1994-10-30  |  8KB  |  251 lines

  1.  
  2. ; Lezione5b.s    SCORRIMENTO DI UNA FIGURA A DESTRA E SINISTRA COL $dff102
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28.  
  29. ;
  30.  
  31.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  32.     move.w    d0,$dff088        ; Facciamo partire la COP
  33.  
  34.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  35.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  36.  
  37. mouse:
  38.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  39.     bne.s    mouse        ; Se non ancora, non andare avanti
  40.  
  41.     bsr.s    MuoviCopper    ; fa scorrere col $dff102 la figura a destra
  42.                 ; e a sinistra (massimo 16 pixel), qua
  43.                 ; la scritta COMMODORE
  44.  
  45.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  46.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  47.  
  48.     bsr.w    MuoviCopper2    ; fa scorrere col $dff102 la figura a destra
  49.                 ; e a sinistra (massimo 16 pixel), qua la
  50.                 ; scritta AMIGA
  51.  
  52. Aspetta:
  53.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  54.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  55.  
  56.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  57.     bne.s    mouse        ; se no, torna a mouse:
  58.  
  59.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  60.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  64.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  65.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  66.     rts            ; USCITA DAL PROGRAMMA
  67.  
  68. ;    Dati
  69.  
  70. GfxName:
  71.     dc.b    "graphics.library",0,0    
  72.  
  73. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  74.     dc.l    0    ; della graphics.library
  75.  
  76. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  77.     dc.l    0
  78.  
  79. ;    Questa routine sposta la scritta "COMMODORE", agendo su MIOCON1
  80.  
  81. MuoviCopper:
  82.     TST.B    FLAG        ; Dobbiamo avanzare o indietreggiare? se
  83.                 ; FLAG e' azzerata, (cioe' il TST verifica il
  84.                 ; BEQ)
  85.                 ; allora saltiamo a AVANTI, se invece e' a $FF
  86.                 ; (se cioe' questo TST non e' verificato)
  87.                 ; continuiamo indietreggiando (con dei sub)
  88.     beq.w    AVANTI
  89.     cmpi.b    #$00,MIOCON1    ; siamo arrivati alla posizione normale, ossia
  90.                 ; tutto indietro?
  91.     beq.s    MettiAvanti    ; se si, dobbiamo avanzare!
  92.     sub.b    #$11,MIOCON1    ; sottraiamo 1 allo scroll dei bitplanes
  93.     rts            ; dispari ($ff,$ee,$dd,$cc,$bb,$aa,$99....)
  94.  
  95. MettiAvanti:
  96.     clr.b    FLAG        ; Azzerando FLAG, al TST.B FLAG il BEQ
  97.     rts            ; fara' saltare alla routine AVANTI, e
  98.                 ; la figura avanzera' (verso destra)
  99.  
  100. AVANTI:
  101.     cmpi.b    #$ff,MIOCON1    ; siamo arrivati allo scroll massimo in
  102.                 ; avanti, ossia $FF? ($f pari e $f dispari)
  103.     beq.s    MettiIndietro    ; se si, siamo dobbiamo tornare indietro
  104.     add.b    #$11,MIOCON1    ; aggiungiamo 1 allo scroll dei bitplanes
  105.                 ; pari e dispari ($11,$22,$33,$44 etc..)
  106.     rts
  107.  
  108. MettiIndietro:
  109.     move.b    #$ff,FLAG    ; Quando la label FLAG non e' a zero,
  110.     rts            ; significa che dobbiamo indietreggiare
  111.                 ; verso sinistra
  112.  
  113. ;    Questo byte e' un FLAG, ossia serve per indicare se andare avanti o
  114. ;    indietro.
  115.  
  116. FLAG:
  117.     dc.b    0,0
  118.  
  119. ;************************************************************************
  120.  
  121. ;    Questa routine sposta la scritta "AMIGA", agendo su MIACON1
  122.  
  123. MuoviCopper2:
  124.     TST.B    FLAG2        ; Dobbiamo avanzare o indietreggiare?
  125.     beq.w    AVANTI2
  126.     cmpi.b    #$00,MIACON1    ; siamo arrivati alla posizione normale?
  127.     beq.s    MettiAvanti2    ; se si, dobbiamo avanzare!
  128.     sub.b    #$11,MIACON1    ; sottraiamo 1 allo scroll dei bitplanes
  129.     rts            ; ($ff,$ee,$dd,$cc,$bb,$aa,$99....)
  130.  
  131. MettiAvanti2:
  132.     clr.b    FLAG2        ; Azzerando FLAG, al TST.B FLAG il BEQ
  133.     rts            ; fara' saltare alla routine AVANTI
  134.  
  135. AVANTI2:
  136.     cmpi.b    #$ff,MIACON1    ; siamo arrivati allo scroll massimo in
  137.                 ; avanti, ossia $FF? ($f pari e $f dispari)
  138.     beq.s    MettiIndietro2    ; se si, siamo dobbiamo tornare indietro
  139.     add.b    #$11,MIACON1    ; aggiungiamo 1 allo scroll dei bitplanes
  140.                 ; pari e dispari ($11,$22,$33,$44 etc..)
  141.     rts
  142.  
  143. MettiIndietro2:
  144.     move.b    #$ff,FLAG2    ; Quando la label FLAG non e' a zero,
  145.     rts            ; significa che dobbiamo indietreggiare.
  146.  
  147. Finito2:
  148.     rts
  149.  
  150. ;    Questo byte e' un FLAG, ossia serve per indicare se andare avanti o
  151. ;    indietro.
  152.  
  153. FLAG2:
  154.     dc.b    0,0
  155.  
  156.  
  157.     SECTION    GRAPHIC,DATA_C
  158.  
  159. COPPERLIST:
  160.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  161.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  162.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  163.     dc.w    $13e,$0000
  164.  
  165.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  166.     dc.w    $90,$2cc1    ; DiwStop
  167.     dc.w    $92,$0038    ; DdfStart
  168.     dc.w    $94,$00d0    ; DdfStop
  169.  
  170.     dc.w    $102        ; BplCon1 - IL REGISTRO
  171.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  172. MIOCON1:
  173.     dc.b    $00        ; BplCon1 - IL BYTE UTILIZZATO!!!
  174.  
  175.     dc.w    $104,0        ; BplCon2
  176.     dc.w    $108,0        ; Bpl1Mod
  177.     dc.w    $10a,0        ; Bpl2Mod
  178.  
  179.             ; 5432109876543210    ; BPLCON0:
  180.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  181.                     ; 3 bitplanes lowres, non lace
  182. BPLPOINTERS:
  183.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane - BPL0PT
  184.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane - BPL1PT
  185.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane - BPL2PT
  186.  
  187.     dc.w    $0180,$000    ; color0
  188.     dc.w    $0182,$475    ; color1
  189.     dc.w    $0184,$fff    ; color2
  190.     dc.w    $0186,$ccc    ; color3
  191.     dc.w    $0188,$999    ; color4
  192.     dc.w    $018a,$232    ; color5
  193.     dc.w    $018c,$777    ; color6
  194.     dc.w    $018e,$444    ; color7
  195.  
  196.     dc.w    $7007,$fffe    ; Aspettiamo fino sotto la scritta "COMMODORE"
  197.  
  198.     dc.w    $102        ; BplCon1 - IL REGISTRO
  199.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  200. MIACON1:
  201.     dc.b    $ff        ; BplCon1 - IL BYTE UTILIZZATO!!!
  202.  
  203.  
  204.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  205.  
  206. ;    figura
  207.  
  208. PIC:
  209.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  210.                     ; convertita col KEFCON, fatta di
  211.                     ; 3 bitplanes consecutivi
  212.  
  213.     end
  214.  
  215. Questo esempio e' stato ottenuto copiando la routine Muovicopper, e cambiando
  216. le sue label aggiungendoci un 2 per "cambiargli nome", per non riscriverla
  217. tutta. Spesso per aggiungere routines simili si ricorre alla copia del pezzo
  218. interessato con Amiga+b+c+i, poi si cambia il nome alle label. Per quanto
  219. riguarda la copperlist e' bastato aggiungere un'altro $dff102, il cui nome
  220. e' MIACON1, dopo un WAIT $7007, ossia sotto la scritta commodore, per cui
  221. agisce sulla parte sottostante di figura, che e' il disegno "AMIGA".
  222. Per creare la "DISCORDANZA" di movimento, per cui una parte va a destra
  223. quando l'altra va a sinistra e viceversa, e' bastato far partire il loop
  224. da $FF anziche' da $00, ossia dalla posizione 15, per cui i due cicli
  225. Muovicopper e Muovicopper2 proseguino dalle 2 posizioni opposte.
  226.  
  227.     dc.w    $102        ; BplCon1 - IL REGISTRO
  228.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  229. MIOCON1:
  230.     dc.b    $00        ; BplCon1 - IL BYTE UTILIZZATO!!!
  231.  
  232.     ...
  233.  
  234.     dc.w    $102        ; BplCon1 - IL REGISTRO
  235.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  236. MIACON1:
  237.     dc.b    $ff        ; BplCon1 - IL BYTE UTILIZZATO!!!
  238.  
  239. Provate a cambiare il byte MIACON1:, anziche' $ff provate con $55 e $aa o altri
  240. valori, e risultera' piu' chiaro.
  241.  
  242. Col tasto destro del mouse si blocca solo il secondo $102.
  243. Provate a cambiare il Wait per far avvenire la differenza di scroll in altre
  244. posizioni, ad esempio:
  245.  
  246.  
  247.     dc.w    $a007,$fffe
  248.  
  249. Fa "dividere" la figura nel mezzo della scritta "AMIGA".
  250.  
  251.